﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace ThuPhap.ExtensionClass
{
    public class ConvertVietnameseCode
    {
        public string UnicodeToVniWindows(string InputText)
        {
            string result = InputText;
            int[] aciiCode = {7845, 7847, 7849, 7851, 7853, 226, 225, 224, 7843, 227, 7841, 7855, 7857, 7859,
                                   7861, 7863, 259, 250, 249, 7911, 361, 7909, 7913, 7915, 7917, 7919, 7921, 432,
                                   7871, 7873, 7875, 7877, 7879, 234, 233, 232, 7867, 7869, 7865, 7889, 7891, 7893,
                                   7895, 7897, 244, 243, 242, 7887, 245, 7885, 7899, 7901, 7903, 7905, 7907, 417,
                                   237, 236, 7881, 297, 7883, 253, 7923, 7927, 7929, 7925, 273, 7844, 7846, 7848,
                                   7850, 7852, 194, 193, 192, 7842, 195, 7840, 7854, 7856, 7858, 7860, 7862, 258,
                                   218, 217, 7910, 360, 7908, 7912, 7914, 7916, 7918, 7920, 431, 7870, 7872, 7874,
                                   7876, 7878, 202, 201, 200, 7866, 7868, 7864, 7888, 7890, 7892, 7894, 7896, 212,
                                   211, 210, 7886, 213, 7884, 7898, 7900, 7902, 7904, 7906, 416, 205, 204, 7880, 296,
                                   7882, 221, 7922, 7926, 7928, 7924, 272};

            string[] Vni = {"aá", "aà", "aå", "aã", "aä", "aâ", "aù", "aø", "aû", "aõ", "aï", "aé", "aè",
                               "aú", "aü", "aë", "aê", "uù", "uø", "uû", "uõ", "uï", "öù", "öø", "öû", "öõ",
                               "öï", "ö", "eá", "eà", "eå", "eã", "eä", "eâ", "eù", "eø", "eû", "eõ", "eï",
                               "oá", "oà", "oå", "oã", "oä", "oâ", "où", "oø", "oû", "oõ", "oï", "ôù", "ôø",
                               "ôû", "ôõ", "ôï", "ô", "í", "ì", "æ", "ó", "ò", "yù", "yø", "yû", "yõ", "î",
                               "ñ", "AÁ", "AÀ", "AÅ", "AÃ", "AÄ", "AÂ", "AÙ", "AØ", "AÛ", "AÕ",
                               "AÏ", "AÉ", "AÈ", "AÚ", "AÜ", "AË", "AÊ", "UÙ", "UØ", "UÛ", "UÕ",
                               "UÏ", "ÖÙ", "ÖØ", "ÖÛ", "ÖÕ", "ÖÏ", "Ö", "EÁ", "EÀ", "EÅ",
                               "EÃ", "EÄ", "EÂ", "EÙ", "EØ", "EÛ", "EÕ", "EÏ", "OÁ", "OÀ", "OÅ",
                               "OÃ", "OÄ", "OÂ", "OÙ", "OØ", "OÛ", "OÕ", "OÏ", "ÔÙ", "ÔØ", "ÔÛ",
                               "ÔÕ", "ÔÏ", "Ô", "Í", "Ì", "Æ", "Ó", "Ò", "YÙ", "YØ", "YÛ", "YÕ",
                               "Î", "Ñ"};

            string[] error = {"aauø", "aaø", "aaoõ", "auø", "aoõ", "aeù", "aeø", "auuø", "aeâ", "uuø", "uoõ",
                            "öoõ", "eoõ", "AAUØ", "AAØ", "AAOÕ", "AUØ", "AOÕ", "AEÙ", "AEØ", "AUUØ",
                            "AEÂ", "UUØ", "UOÕ", "ÖOÕ", "EOÕ"};

            string[] fixedError = {"aá", "aà", "aã", "aù", "aõ", "aé", "aè", "aú", "aê", "uù", "uõ", "öõ", "eõ", "AÁ",
                                "AÀ", "AÃ", "AÙ", "AÕ", "AÉ", "AÈ", "AÚ", "AÊ", "UÙ", "UÕ", "ÖÕ", "EÕ"};
            

            for (int i = 0; i <= 133; i++)
            {
                char charFromACII = (char)aciiCode[i];
                result = result.Replace(charFromACII.ToString(), Vni[i]);
            }

            for (int i = 0; i <= 25; i++)
            {
                result = result.Replace(error[i], fixedError[i]);
            }

            

            return result;
        }

        public string VniWindowsToUnicode(string InputText)
        {
            string result = InputText;
            int[] aciiCode = {7845, 7847, 7849, 7851, 7853, 226, 225, 224, 7843, 227, 7841, 7855, 7857, 7859,
                                   7861, 7863, 259, 250, 249, 7911, 361, 7909, 7913, 7915, 7917, 7919, 7921, 432,
                                   7871, 7873, 7875, 7877, 7879, 234, 233, 232, 7867, 7869, 7865, 7889, 7891, 7893,
                                   7895, 7897, 244, 243, 242, 7887, 245, 7885, 7899, 7901, 7903, 7905, 7907, 417,
                                   237, 236, 7881, 297, 7883, 253, 7923, 7927, 7929, 7925, 273, 7844, 7846, 7848,
                                   7850, 7852, 194, 193, 192, 7842, 195, 7840, 7854, 7856, 7858, 7860, 7862, 258,
                                   218, 217, 7910, 360, 7908, 7912, 7914, 7916, 7918, 7920, 431, 7870, 7872, 7874,
                                   7876, 7878, 202, 201, 200, 7866, 7868, 7864, 7888, 7890, 7892, 7894, 7896, 212,
                                   211, 210, 7886, 213, 7884, 7898, 7900, 7902, 7904, 7906, 416, 205, 204, 7880, 296,
                                   7882, 221, 7922, 7926, 7928, 7924, 272};

            string[] Vni = {"aá", "aà", "aå", "aã", "aä", "aâ", "aù", "aø", "aû", "aõ", "aï", "aé", "aè",
                               "aú", "aü", "aë", "aê", "uù", "uø", "uû", "uõ", "uï", "öù", "öø", "öû", "öõ",
                               "öï", "ö", "eá", "eà", "eå", "eã", "eä", "eâ", "eù", "eø", "eû", "eõ", "eï",
                               "oá", "oà", "oå", "oã", "oä", "oâ", "où", "oø", "oû", "oõ", "oï", "ôù", "ôø",
                               "ôû", "ôõ", "ôï", "ô", "í", "ì", "æ", "ó", "ò", "yù", "yø", "yû", "yõ", "î",
                               "ñ", "AÁ", "AÀ", "AÅ", "AÃ", "AÄ", "AÂ", "AÙ", "AØ", "AÛ", "AÕ",
                               "AÏ", "AÉ", "AÈ", "AÚ", "AÜ", "AË", "AÊ", "UÙ", "UØ", "UÛ", "UÕ",
                               "UÏ", "ÖÙ", "ÖØ", "ÖÛ", "ÖÕ", "ÖÏ", "Ö", "EÁ", "EÀ", "EÅ",
                               "EÃ", "EÄ", "EÂ", "EÙ", "EØ", "EÛ", "EÕ", "EÏ", "OÁ", "OÀ", "OÅ",
                               "OÃ", "OÄ", "OÂ", "OÙ", "OØ", "OÛ", "OÕ", "OÏ", "ÔÙ", "ÔØ", "ÔÛ",
                               "ÔÕ", "ÔÏ", "Ô", "Í", "Ì", "Æ", "Ó", "Ò", "YÙ", "YØ", "YÛ", "YÕ",
                               "Î", "Ñ"};

            string[] error = {"aauø", "aaø", "aaoõ", "auø", "aoõ", "aeù", "aeø", "auuø", "aeâ", "uuø", "uoõ",
                            "öoõ", "eoõ", "AAUØ", "AAØ", "AAOÕ", "AUØ", "AOÕ", "AEÙ", "AEØ", "AUUØ",
                            "AEÂ", "UUØ", "UOÕ", "ÖOÕ", "EOÕ"};

            string[] fixedError = {"aá", "aà", "aã", "aù", "aõ", "aé", "aè", "aú", "aê", "uù", "uõ", "öõ", "eõ", "AÁ",
                                "AÀ", "AÃ", "AÙ", "AÕ", "AÉ", "AÈ", "AÚ", "AÊ", "UÙ", "UÕ", "ÖÕ", "EÕ"};

            for (int i = 0; i <= 133; i++)
            {
                char charFromACII = (char)aciiCode[i];
                result = result.Replace(Vni[i],charFromACII.ToString());
            }

            for (int i = 0; i <= 25; i++)
            {
                result = result.Replace(fixedError[i], error[i]);
            }

            

            return result;
        }

        public string TelexToUnicode(string InputText)
        {
            string result = InputText;
            int[] aciiCode = {7845, 7847, 7849, 7851, 7853, 226, 225, 224, 7843, 227, 7841, 7855, 7857, 7859, 
                                7861, 7863, 259, 250, 249, 7911, 361, 7909, 7913, 7915, 7917, 7919, 7921, 432, 
                                7871, 7873, 7875, 7877, 7879, 234, 233, 232, 7867, 7869, 7865, 7889, 7891, 7893, 
                                7895, 7897, 244, 243, 242, 7887, 245, 7885, 7899, 7901, 7903, 7905, 7907, 417, 
                                237, 236, 7881, 297, 7883, 253, 7923, 7927, 7929, 7925, 273, 7844, 7846, 7848, 
                                7850, 7852, 194, 193, 192, 7842, 195, 7840, 7854, 7856, 7858, 7860, 7862, 258, 
                                218, 217, 7910, 360, 7908, 7912, 7914, 7916, 7918, 7920, 431, 7870, 7872, 7874, 
                                7876, 7878, 202, 201, 200, 7866, 7868, 7864, 7888, 7890, 7892, 7894, 7896, 212, 
                                211, 210, 7886, 213, 7884, 7898, 7900, 7902, 7904, 7906, 416, 205, 204, 7880, 296, 
                                7882, 221, 7922, 7926, 7928, 7924, 272};

            string[] Telex = {"aas", "aaf", "aar", "aax", "aaj", "aa", "as", "af", "ar", "ax", "aj", "aws", "awf", 
                            "awr", "awx", "awj", "aw", "us", "uf", "ur", "ux", "uj", "uws", "uwf", "uwr", "uwx", 
                            "uwj", "uw", "ees", "eef", "eer", "eex", "eej", "ee", "es", "ef", "er", "ex", "ej", 
                            "oos", "oof", "oor", "oox", "ooj", "oo", "os", "of", "or", "ox", "oj", "ows", "owf", 
                            "owr", "owx", "owj", "ow", "is", "if", "ir", "ix", "ij", "ys", "yf", "yr", "yx", "yj", 
                            "dd", "AAS", "AAF", "AAR", "AAX", "AAJ", "AA", "AS", "AF", "AR", "AX", 
                            "AJ", "AWS", "AWF", "AWR", "AWX", "AWJ", "AW", "US", "UF", "UR", "UX", 
                            "UJ", "UWS", "UWF", "UWR", "UWX", "UWJ", "UW", "EES", "EEF", "EER", 
                            "EEX", "EEJ", "EE", "ES", "EF", "ER", "EX", "EJ", "OOS", "OOF", "OOR", 
                            "OOX", "OOJ", "OO", "OS", "OF", "OR", "OX", "OJ", "OWS", "OWF", "OWR", 
                            "OWX", "OWJ", "OW", "IS", "IF", "IR", "IX", "IJ", "YS", "YF", "YR", "YX", 
                            "YJ", "DD"};
            for (int i = 0; i <= 133; i++)
            {
                char charFromACII = (char)aciiCode[i];
                result = result.Replace(Telex[i], charFromACII.ToString());
            }

            result = result.Replace("'", ""); //Neu muon hien thi ko dau thi phai go ky tu ' . Vd: Vi'sual Ba'sic

            string[] VNIWidowsTelex = {"ăa", "âa", "ăw", "âw","êe", "đd", "ôo", "ôw", "ơo", "ơw", "ưw",
                                     "Ăa", "Âa", "Ăw", "Âw","Êe", "Đd", "Ôo", "Ôw", "Ơo", "Ơw", "Ưw",
                                     "ĂA", "ÂA", "ĂW", "ÂW","ÊE", "ĐE", "ÔO", "ÔW", "ƠO", "ƠW", "ƯW"};
            string[] UnicodeTelex = {"â","aa","aw","ă", "ee", "dd", "oo", "ơ", "ô", "ow", "uw",
                                   "Â","Aa","Aw","Ă", "Ee", "Dd", "Oo", "Ơ", "Ô", "Ow", "Uw",
                                   "Â","AA","AW","Ă", "EE", "DD", "OO", "Ơ", "Ô", "OW", "UW"};

            for (int i = 0; i < VNIWidowsTelex.Length; i++)
            {
                result = result.Replace(VNIWidowsTelex[i], UnicodeTelex[i]);
            }
            return result;
        }

        public string VniToUnicode(string InputText)
        {
            string result = InputText;
            int[] aciiCode = {7845, 7847, 7849, 7851, 7853, 226, 225, 224, 7843, 227, 7841, 7855, 7857, 7859, 
                                7861, 7863, 259, 250, 249, 7911, 361, 7909, 7913, 7915, 7917, 7919, 7921, 432, 
                                7871, 7873, 7875, 7877, 7879, 234, 233, 232, 7867, 7869, 7865, 7889, 7891, 7893, 
                                7895, 7897, 244, 243, 242, 7887, 245, 7885, 7899, 7901, 7903, 7905, 7907, 417, 
                                237, 236, 7881, 297, 7883, 253, 7923, 7927, 7929, 7925, 273, 7844, 7846, 7848, 
                                7850, 7852, 194, 193, 192, 7842, 195, 7840, 7854, 7856, 7858, 7860, 7862, 258, 
                                218, 217, 7910, 360, 7908, 7912, 7914, 7916, 7918, 7920, 431, 7870, 7872, 7874, 
                                7876, 7878, 202, 201, 200, 7866, 7868, 7864, 7888, 7890, 7892, 7894, 7896, 212, 
                                211, 210, 7886, 213, 7884, 7898, 7900, 7902, 7904, 7906, 416, 205, 204, 7880, 296, 
                                7882, 221, 7922, 7926, 7928, 7924, 272};

            string[] Vni = {"a61", "a62", "a63", "a64", "a65", "a6", "a1", "a2", "a3", "a4", "a5", "a81", "a82", 
                            "a83", "a84", "a85", "a8", "u1", "u2", "u3", "u4", "u5", "u71", "u72", "u73", "u74", 
                            "u75", "u7", "e61", "e62", "e63", "e64", "e65", "e6", "e1", "e2", "e3", "e4", "e5", 
                            "o61", "o62", "o63", "o64", "o65", "o6", "o1", "o2", "o3", "o4", "o5", "o71", "o72", 
                            "o73", "o74", "o75", "o7", "i1", "i2", "i3", "i4", "i5", "y1", "y2", "y3", "y4", "y5", 
                            "d9", "A61", "A62", "A63", "A64", "A65", "A6", "A1", "A2", "A3", "A4", "A5", 
                            "A81", "A82", "A83", "A84", "A85", "A8", "U1", "U2", "U3", "U4", "U5", "U71", 
                            "U72", "U73", "U74", "U75", "U7", "E61", "E62", "E63", "E64", "E65", "E6", "E1", 
                            "E2", "E3", "E4", "E5", "O61", "O62", "O63", "O64", "O65", "O6", "O1", "O2", 
                            "O3", "O4", "O5", "O71", "O72", "O73", "O74", "O75", "O7", "I1", "I2", "I3", "I4", 
                            "I5", "Y1", "Y2", "Y3", "Y4", "Y5", "D9"};
            for (int i = 0; i <= 133; i++)
            {
                char charFromACII = (char)aciiCode[i];
                result = result.Replace(Vni[i], charFromACII.ToString());
            }

            return result;
        }

        public string UnicodeToTelex(string InputText)
        {
            string result = InputText;
            int[] aciiCode = {7845, 7847, 7849, 7851, 7853, 226, 225, 224, 7843, 227, 7841, 7855, 7857, 7859, 
                                7861, 7863, 259, 250, 249, 7911, 361, 7909, 7913, 7915, 7917, 7919, 7921, 432, 
                                7871, 7873, 7875, 7877, 7879, 234, 233, 232, 7867, 7869, 7865, 7889, 7891, 7893, 
                                7895, 7897, 244, 243, 242, 7887, 245, 7885, 7899, 7901, 7903, 7905, 7907, 417, 
                                237, 236, 7881, 297, 7883, 253, 7923, 7927, 7929, 7925, 273, 7844, 7846, 7848, 
                                7850, 7852, 194, 193, 192, 7842, 195, 7840, 7854, 7856, 7858, 7860, 7862, 258, 
                                218, 217, 7910, 360, 7908, 7912, 7914, 7916, 7918, 7920, 431, 7870, 7872, 7874, 
                                7876, 7878, 202, 201, 200, 7866, 7868, 7864, 7888, 7890, 7892, 7894, 7896, 212, 
                                211, 210, 7886, 213, 7884, 7898, 7900, 7902, 7904, 7906, 416, 205, 204, 7880, 296, 
                                7882, 221, 7922, 7926, 7928, 7924, 272};

            string[] Telex = {"aas", "aaf", "aar", "aax", "aaj", "aa", "as", "af", "ar", "ax", "aj", "aws", "awf", 
                            "awr", "awx", "awj", "aw", "us", "uf", "ur", "ux", "uj", "uws", "uwf", "uwr", "uwx", 
                            "uwj", "uw", "ees", "eef", "eer", "eex", "eej", "ee", "es", "ef", "er", "ex", "ej", 
                            "oos", "oof", "oor", "oox", "ooj", "oo", "os", "of", "or", "ox", "oj", "ows", "owf", 
                            "owr", "owx", "owj", "ow", "is", "if", "ir", "ix", "ij", "ys", "yf", "yr", "yx", "yj", 
                            "dd", "AAS", "AAF", "AAR", "AAX", "AAJ", "AA", "AS", "AF", "AR", "AX", 
                            "AJ", "AWS", "AWF", "AWR", "AWX", "AWJ", "AW", "US", "UF", "UR", "UX", 
                            "UJ", "UWS", "UWF", "UWR", "UWX", "UWJ", "UW", "EES", "EEF", "EER", 
                            "EEX", "EEJ", "EE", "ES", "EF", "ER", "EX", "EJ", "OOS", "OOF", "OOR", 
                            "OOX", "OOJ", "OO", "OS", "OF", "OR", "OX", "OJ", "OWS", "OWF", "OWR", 
                            "OWX", "OWJ", "OW", "IS", "IF", "IR", "IX", "IJ", "YS", "YF", "YR", "YX", 
                            "YJ", "DD"};
            for (int i = 0; i <= 133; i++)
            {
                char charFromACII = (char)aciiCode[i];
                result = result.Replace(charFromACII.ToString(),Telex[i]);
            }
            return result;
        }

        public string UnicodeToVni(string InputText)
        {
            string result = InputText;
            int[] aciiCode = {7845, 7847, 7849, 7851, 7853, 226, 225, 224, 7843, 227, 7841, 7855, 7857, 7859, 
                                7861, 7863, 259, 250, 249, 7911, 361, 7909, 7913, 7915, 7917, 7919, 7921, 432, 
                                7871, 7873, 7875, 7877, 7879, 234, 233, 232, 7867, 7869, 7865, 7889, 7891, 7893, 
                                7895, 7897, 244, 243, 242, 7887, 245, 7885, 7899, 7901, 7903, 7905, 7907, 417, 
                                237, 236, 7881, 297, 7883, 253, 7923, 7927, 7929, 7925, 273, 7844, 7846, 7848, 
                                7850, 7852, 194, 193, 192, 7842, 195, 7840, 7854, 7856, 7858, 7860, 7862, 258, 
                                218, 217, 7910, 360, 7908, 7912, 7914, 7916, 7918, 7920, 431, 7870, 7872, 7874, 
                                7876, 7878, 202, 201, 200, 7866, 7868, 7864, 7888, 7890, 7892, 7894, 7896, 212, 
                                211, 210, 7886, 213, 7884, 7898, 7900, 7902, 7904, 7906, 416, 205, 204, 7880, 296, 
                                7882, 221, 7922, 7926, 7928, 7924, 272};

            string[] Vni = {"a61", "a62", "a63", "a64", "a65", "a6", "a1", "a2", "a3", "a4", "a5", "a81", "a82", 
                            "a83", "a84", "a85", "a8", "u1", "u2", "u3", "u4", "u5", "u71", "u72", "u73", "u74", 
                            "u75", "u7", "e61", "e62", "e63", "e64", "e65", "e6", "e1", "e2", "e3", "e4", "e5", 
                            "o61", "o62", "o63", "o64", "o65", "o6", "o1", "o2", "o3", "o4", "o5", "o71", "o72", 
                            "o73", "o74", "o75", "o7", "i1", "i2", "i3", "i4", "i5", "y1", "y2", "y3", "y4", "y5", 
                            "d9", "A61", "A62", "A63", "A64", "A65", "A6", "A1", "A2", "A3", "A4", "A5", 
                            "A81", "A82", "A83", "A84", "A85", "A8", "U1", "U2", "U3", "U4", "U5", "U71", 
                            "U72", "U73", "U74", "U75", "U7", "E61", "E62", "E63", "E64", "E65", "E6", "E1", 
                            "E2", "E3", "E4", "E5", "O61", "O62", "O63", "O64", "O65", "O6", "O1", "O2", 
                            "O3", "O4", "O5", "O71", "O72", "O73", "O74", "O75", "O7", "I1", "I2", "I3", "I4", 
                            "I5", "Y1", "Y2", "Y3", "Y4", "Y5", "D9"};
            for (int i = 0; i <= 133; i++)
            {
                char charFromACII = (char)aciiCode[i];
                result = result.Replace(charFromACII.ToString(), Vni[i]);
            }

            return result;
        }
    }
}
